#!/bin/bash

# -------------------根据实际修改参数------------------------------------
# MySQL中的mysql_config_editor全路径，使用command -v mysql_config_editor或which mysql_config_editor命令查询路径
MYSQL_CONFIG_EDITOR_PATH="/www/server/mysql/bin/mysql_config_editor"
# MySQL中的mysqldump全路径，使用command -v mysqldump或which mysqldump命令查询路径
MYSQLDUMP_PATH="/www/server/mysql/bin/mysqldump"

# MySQL数据库配置
DB_NAME="wordpress"  # 请根据实际数据库名称修改
DB_USER="wordpress"  # 请根据实际数据库用户名修改
# 注意：密码可以通过多种方式提供，这里使用安全的方式

# 网站服务器IP
WEB_IP="192.168.9.6"  # 请根据实际网站服务器IP修改
# 网站文件配置
WEB_DIR="/www/wwwroot/192.168.9.6"  # 请根据实际网站目录修改
# 安装Linux宝塔后，相关NGINX配置文件
CONFIG_FILES=("/www/server/panel/vhost/nginx/$WEB_IP.conf" 
              "/www/server/panel/vhost/nginx/phpfpm_status.conf" 
              "/www/server/panel/vhost/nginx/0.default.conf")  

# --------------------------------------------------------------------

# 备份脚本配置
BACKUP_DIR="/home/backups"  # 备份文件存储目录
DATE=$(date +%Y%m%d_%H%M%S)  # 备份时间戳
BACKUP_NAME="backup_$DATE"   # 备份文件名

# 颜色输出函数
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
}

error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
}

warn() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
}

# 创建备份目录
create_backup_dir() {
    if [ ! -d "$BACKUP_DIR" ]; then
        log "创建备份目录: $BACKUP_DIR"
        mkdir -p "$BACKUP_DIR"
        if [ $? -ne 0 ]; then
            error "无法创建备份目录"
            exit 1
        fi
    fi
}

# 备份MySQL数据库
backup_database() {
    log "开始备份MySQL数据库: $DB_NAME"
	
    # 检查mysql_config_editor是否存在
    if [ ! -f "$MYSQL_CONFIG_EDITOR_PATH" ]; then
        error "错误：在这个路径下， ${MYSQL_CONFIG_EDITOR_PATH} ，无法找到 mysql_config_editor "
        exit 1
    fi
	
    # 检查mysqldump是否存在
    if [ ! -f "$MYSQLDUMP_PATH" ]; then
        error "错误：在这个路径下， ${MYSQLDUMP_PATH} ，无法找到 mysqldump "
        exit 1
    fi
	
	# 方法1：使用mysql_config_editor（安全）
    if $MYSQL_CONFIG_EDITOR_PATH print --login-path=backup > /dev/null 2>&1; then
        $MYSQLDUMP_PATH --login-path=backup --no-tablespaces $DB_NAME > "$BACKUP_DIR/${BACKUP_NAME}_database.sql"
	# 方法2：使用.mysqlpass文件（推荐）
    elif [ -f ~/.mysqlpass ]; then
        DB_PASS=$(cat ~/.mysqlpass)
        $MYSQLDUMP_PATH -u$DB_USER -p$DB_PASS --no-tablespaces $DB_NAME > "$BACKUP_DIR/${BACKUP_NAME}_database.sql"
    else
        warn "未找到数据库密码配置"
        exit 1
    fi

    if [ $? -eq 0 ]; then
        log "数据库备份成功: ${BACKUP_NAME}_database.sql"
        # 压缩数据库备份
        gzip "$BACKUP_DIR/${BACKUP_NAME}_database.sql"
        log "数据库备份已压缩"
    else
        error "数据库备份失败"
        return 1
    fi
}

# 备份网站文件
backup_website() {
    log "开始备份网站文件"

    if [ ! -d "$WEB_DIR" ]; then
        error "网站目录不存在: $WEB_DIR"
        return 1
    fi

    # 创建网站文件备份
    tar -czf "$BACKUP_DIR/${BACKUP_NAME}_website.tar.gz" -C $(dirname "$WEB_DIR") $(basename "$WEB_DIR") 2>/dev/null

    if [ $? -eq 0 ]; then
        log "网站文件备份成功: ${BACKUP_NAME}_website.tar.gz"
    else
        error "网站文件备份失败"
        return 1
    fi
}

# 备份配置文件
backup_config() {
    log "开始备份配置文件"

    CONFIG_BACKUP_FILE="$BACKUP_DIR/${BACKUP_NAME}_config.tar.gz"
    CONFIG_TEMP_DIR="/tmp/config_backup_$$"

    mkdir -p "$CONFIG_TEMP_DIR"

    # 复制存在的配置文件
    for config_path in "${CONFIG_FILES[@]}"; do
        if [ -e "$config_path" ]; then
            cp -r "$config_path" "$CONFIG_TEMP_DIR/" 2>/dev/null
        fi
    done

    # 创建压缩包
    if [ "$(ls -A "$CONFIG_TEMP_DIR")" ]; then
        tar -czf "$CONFIG_BACKUP_FILE" -C "$CONFIG_TEMP_DIR" .
        log "配置文件备份成功: ${BACKUP_NAME}_config.tar.gz"
    else
        warn "未找到任何配置文件"
    fi

    # 清理临时文件
    rm -rf "$CONFIG_TEMP_DIR"
}

# 清理旧备份文件（保留最近60天的备份）
clean_old_backups() {
    log "清理60天前的旧备份文件"
    find "$BACKUP_DIR" -name "backup_*.tar.gz" -type f -mtime +60 -delete
    find "$BACKUP_DIR" -name "backup_*.sql.gz" -type f -mtime +60 -delete
    log "旧备份清理完成"
}

# 生成备份报告
generate_report() {
    REPORT_FILE="$BACKUP_DIR/backup_report_$DATE.txt"

    {
        echo "=== 备份报告 ==="
        echo "备份时间: $(date)"
        echo "备份目录: $BACKUP_DIR"
        echo "备份文件:"
        ls -lh "$BACKUP_DIR" | grep "$BACKUP_NAME"
        echo ""
        echo "磁盘使用情况:"
        df -h "$BACKUP_DIR"
        echo ""
        echo "备份大小统计:"
        du -sh "$BACKUP_DIR"
    } > "$REPORT_FILE"

    log "备份报告已生成: backup_report_$DATE.txt"
}

# 主函数
main() {
    log "开始备份流程..."

    # 创建备份目录
    create_backup_dir

    # 执行备份
    backup_database
    backup_website
    backup_config

    # 清理旧备份
    clean_old_backups

    # 生成报告
    generate_report

    log "备份完成！所有文件保存在: $BACKUP_DIR"
}

# 执行主函数
main

